package main

import (
	"fmt"
	"io"
	"net"
	"os"
)

//文件传输器
func main() {
	//提示输入文件
	fmt.Println("请输入需要传输的文件路径")
	var path string
	fmt.Scan(&path)

	//获取文件名
	info, err := os.Stat(path)
	if err != nil {
		fmt.Println("os.Stat err = ", err)
		return
	}

	//主动连接服务器
	conn, err1 := net.Dial("tcp", "localhost:8001")
	if err1 != nil {
		fmt.Println("net.Dial err = ", err1)
		return
	}
	defer conn.Close()
	//先向服务器发送文件名
	_, err = conn.Write([]byte(info.Name()))
	if err != nil {
		fmt.Println("conn.Write err =", err)
		return
	}
	//接收对方的回复,如果回复"OK" ,说明对方准备好,可以发送文件
	var n int
	var buf = make([]byte, 1024)
	n, err = conn.Read(buf)
	if err != nil {
		fmt.Println("conn.Read err =", err)
		return
	}
	if "ok" == string(buf[:n]) {
		//确认准备好了 可以发送文件内容了
		SendFile(path, conn)
	}

}

//用于发送文件内容
func SendFile(path string, conn net.Conn) {
	//以只读方式打开文件
	fileReader, err := os.Open(path)
	if err != nil {
		fmt.Println("os.Open err = ", err)
		return
	}
	//打开成功 使用defer确保文件能够关闭
	defer fileReader.Close()

	//定义一个buf 存储读取文件的内容
	var buf = make([]byte, 2048)

	//文件读取多少 发送多少
	for {
		n, err := fileReader.Read(buf)
		if err != nil {
			if err == io.EOF {
				fmt.Println("文件传输完毕")
			} else {
				fmt.Println("f.Read err = ", err)
			}
			return
		}
		//没有问题就发送给服务器
		conn.Write(buf[:n])
	}

}
